package com.hikari.leetcode.day2;

/**
 * 给定一个字符串数组 words，请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时，它们长度的乘积的最大值。假设字符串中只包含英语的小写字母。如果没有不包含相同字符的一对字符串，返回 0。
 *
 *  
 *
 * 示例 1:
 *
 * 输入: words = ["abcw","baz","foo","bar","fxyz","abcdef"]
 * 输出: 16
 * 解释: 这两个单词为 "abcw", "fxyz"。它们不包含相同字符，且长度的乘积最大。
 * 示例 2:
 *
 * 输入: words = ["a","ab","abc","d","cd","bcd","abcd"]
 * 输出: 4
 * 解释: 这两个单词为 "ab", "cd"。
 * 示例 3:
 *
 * 输入: words = ["a","aa","aaa","aaaa"]
 * 输出: 0
 * 解释: 不存在这样的两个单词。
 *  
 *
 * 提示：
 *
 * 2 <= words.length <= 1000
 * 1 <= words[i].length <= 1000
 * words[i] 仅包含小写字母
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/aseY1I
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class offerII005 {
    public int maxProduct(String[] words) {

        int len = words.length;
        int [] nums = new int [len];
        // 用一个 int 数字统计每个字符串里面 abcd26  个字符出现的位置 a 用 0代替 b 用 1
        // 则 abc 可以表示为 111 def 可以表示为 111000 如果不包含重复字符的字符串转换二进制后做与运算肯定为 0
        for(int i=0;i<len;i++){
            for(int j=0;j<words[i].length();j++){
                nums[i]|=(1 << (words[i].charAt(j)-'a'));
            }
        }
        int res = 0;
        for(int i=0;i<len-1;i++){
            for(int j=i+1;j<len;j++){
                // 如果两个字符串不包含相同元素 那么与运算肯定为 0
                if((nums[i] & nums[j]) == 0){
                    res = Math.max(res,words[i].length()*words[j].length());
                }
            }
        }
        return res;


    }
}
